'use strict'

const permutate = ( aString ) => {
    if ( typeof aString !== 'string' || !aString ) {
      throw new Error( 'The arg must be a valid, non empty string' )
  }
  const characters = aString.split( '' )
  let permutations = [
    [ characters.shift() ]
  ]
  while ( characters.length ) {
    const currentCharacter = characters.shift()
    permutations = calculateCurrentCharacterPermutation( permutations, currentCharacter )
  }
  return permutations
    .map( character => character.join( '' ) )
      .filter( ( item, index, self ) => ( self.indexOf( item ) === index ) )
    .sort()
}

const calculateCurrentCharacterPermutation = ( allPermutations, currentCharacter ) => {
  const currentPermutations = []
  allPermutations.map( permutation => {
    let index = 0
    while ( index <= permutation.length ) {
      const tmp = [ ...permutation ]
      tmp.splice( index, 0, currentCharacter )
      currentPermutations.push( tmp )
      index++
    }
  } )
  return currentPermutations
}

export {
  permutate
}
